/*
    文件内容: 封装Socket相关操作类
    文件名: InetAddress.h
    作者: 中国好青年(码农论坛)
    时间: 2024/9/5

*/
#pragma once

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/tcp.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include "InetAddress.h"

/* 
    函数声明:createNonblockSock
    函数作用:返回一个非阻塞的socket_fd,失败的话,退出程序 
*/
int createNonblockSock();

/*
    类名: Socket
    作用: 封装Socket相关操作类
*/
class Socket
{
private:
    const int fd_;
    std::string ip_;
    uint16_t port_;
public:
    /* 构造函数 和 析构函数 */
    Socket(int fd);
    ~Socket();

    /* Socket相关操作函数 */
    int fd() const;
    std::string ip()  const;
    uint16_t port() const;
    void setReuseAddr(bool flag);
    void setReusePort(bool flag);
    void setKeepAlive(bool flag);
    void setTcpNodelay(bool flag);

    void bind(const InetAddress& servaddr);
    void listen(int listenNum = 128);
    int accept(InetAddress& clientaddr);
    void setIpAndPort(const std::string &ip, uint16_t port);
};